Skip to content

ci: move every action off the deprecated Node 20 runtime - #320

Merged
ralyodio merged 1 commit into
mainfrom
ci-node24-actions
Aug 6, 2026
Merged

ci: move every action off the deprecated Node 20 runtime#320
ralyodio merged 1 commit into
mainfrom
ci-node24-actions

Conversation

@ralyodio

@ralyodio ralyodio commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Kills the Node 20 deprecation annotation that every workflow run has been carrying.

What changed

action from to
actions/checkout v4 v7
actions/setup-node v4 v7
pnpm/action-setup v4 v6
actions/upload-artifact v4 v7
actions/github-script v7 v9
github/codeql-action/upload-sarif v3 v4

The publish annotation named three actions, but the same pins appear across ci.yml, test.yml and threatcrush-scan.yml, and threatcrush-scan.yml carries two more on node20 plus codeql-action v3. Fixing only the one that shouted would have left the warning everywhere else.

Every target was confirmed runs.using: node24 by reading its action.yml rather than inferred from the version number — worth doing, because codeql-action v3 is node20 and v4 is not, and the deprecation notice never mentions it.

Breaking changes, checked rather than skipped

setup-node v5 added automatic caching driven by packageManager, and v6 narrowed that to npm only. Every caller here passes cache: pnpm explicitly, so the automatic path is never consulted. Explicit pnpm caching also requires pnpm on PATH first, and pnpm/action-setup already runs before setup-node in all three workflows.

github-script v9 makes require('@actions/github') fail — that package is now ESM-only. The single script in threatcrush-scan.yml requires fs and uses the injected github client; neither is affected, and v9's README still documents require for builtins and local modules.

upload-artifact v7 adds an opt-in archive parameter; name/path/retention-days are unchanged.

One comment update

publish.yml documents an OIDC trap from #305/#309/#311 — setup-node exporting a dummy NODE_AUTH_TOKEN that corrupted .npmrc and stopped npm attempting the token exchange. setup-node v7 removes exactly that (actions/setup-node#1558), so the comment now says so. It doesn't change the token path we're on, but it means trusted publishing deserves a third attempt before npm's 2FA-bypass deprecation forces one.

Not fixed here

profullstack/coinpaybot@v0 is also node20 and has no newer tag, so coinpay.yml will keep warning until that action is rebuilt and re-tagged in its own repo.

Verification

Full suite green (1142 passing, 0 failing) and all five workflow files parse. The real proof is this PR's own checks — ci, test and threatcrush all run the bumped actions, so a green run here is the annotation being gone.

🤖 Generated with Claude Code

GitHub is forcing Node 20 actions onto Node 24 and annotating every run that
uses one. The publish workflow named three, but the same actions are pinned
across ci, test and threatcrush-scan, and two more there — upload-artifact@v4
and github-script@v7 — are on node20 as well, along with codeql-action@v3.

  actions/checkout            v4 -> v7
  actions/setup-node          v4 -> v7
  pnpm/action-setup           v4 -> v6
  actions/upload-artifact     v4 -> v7
  actions/github-script       v7 -> v9
  codeql-action/upload-sarif  v3 -> v4

Every target confirmed `runs.using: node24` before bumping, rather than assumed
from the version number — codeql-action v3 is node20 and v4 is not, which the
deprecation notice does not mention.

Two breaking changes were checked against actual usage rather than skipped:

setup-node v5 added automatic caching driven by the `packageManager` field and
v6 narrowed it to npm. Every caller here passes `cache: pnpm` explicitly, so
the automatic path is never consulted, and pnpm/action-setup already runs first
in all three workflows — which explicit pnpm caching requires.

github-script v9 makes `require('@actions/github')` fail, since that package is
now ESM-only. The one script here requires `fs` and uses the injected `github`
client, neither of which is affected; v9's own README still documents `require`
for builtins and local modules.

Not fixed here: profullstack/coinpaybot@v0 is also node20 and has no newer tag,
so coinpay.yml keeps warning until that action is rebuilt in its own repo.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 55639e1 into main Aug 6, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown

ThreatCrush Security Scan

93 finding(s)

HIGH/CRITICAL: 50 | MEDIUM: 43

Severity Rule Location
HIGH manifest-typosquat apps/pwa/package.json:19
HIGH js-ssrf-outbound-request apps/pwa/public/sw.js:45
HIGH secret-generic-credential apps/pwa/test/apikey-bearer-scheme.test.mjs:30
HIGH secret-generic-credential apps/pwa/test/apikey-mask.test.mjs:38
HIGH secret-generic-credential apps/pwa/test/apikey-reveal.test.mjs:35
HIGH secret-generic-credential apps/pwa/test/approvals-context.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/approvals-credits.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/approvals-notify.test.mjs:26
HIGH secret-generic-credential apps/pwa/test/approvals-resolve-race.test.mjs:20
HIGH secret-generic-credential apps/pwa/test/auth-form-email.test.mjs:29
HIGH secret-generic-credential apps/pwa/test/auth-form-email.test.mjs:33
HIGH secret-generic-credential apps/pwa/test/auth-page-error.test.mjs:36
HIGH secret-generic-credential apps/pwa/test/cli-device-token.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/cli-pages-balance.test.mjs:32
HIGH secret-generic-credential apps/pwa/test/cli-token.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/credits-pack.test.mjs:51
HIGH secret-generic-credential apps/pwa/test/credits-webhook-event-match.test.mjs:35
HIGH secret-generic-credential apps/pwa/test/credits-webhook.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/csrf-input-escaping.test.mjs:31
HIGH secret-generic-credential apps/pwa/test/csrf-input-escaping.test.mjs:101
HIGH secret-generic-credential apps/pwa/test/logout-csrf.test.mjs:29
HIGH secret-generic-credential apps/pwa/test/moshpit-api-key.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/moshpit-bulk-claim.test.mjs:23
HIGH secret-generic-credential apps/pwa/test/moshpit-claim-full-name.test.mjs:29
HIGH secret-generic-credential apps/pwa/test/moshpit-crawlable.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/moshpit-ending-page.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/moshpit-pins.test.mjs:22
HIGH secret-generic-credential apps/pwa/test/moshpit-pit-page.test.mjs:33
HIGH secret-generic-credential apps/pwa/test/moshpit-records-page.test.mjs:23
HIGH secret-generic-credential apps/pwa/test/moshpit-records.test.mjs:23
HIGH secret-generic-credential apps/pwa/test/moshpit-registry.test.mjs:20
HIGH secret-generic-credential apps/pwa/test/moshpit-related-endings.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/moshpit-sales.test.mjs:16
HIGH secret-generic-credential apps/pwa/test/moshpit-search.test.mjs:74
HIGH secret-generic-credential apps/pwa/test/moshpit-terms.test.mjs:19
HIGH secret-generic-credential apps/pwa/test/moshpit-tlds-pagination.test.mjs:28
HIGH secret-generic-credential apps/pwa/test/passkey-register-duplicate.test.mjs:38
HIGH secret-generic-credential apps/pwa/test/require-auth-next.test.mjs:31
HIGH secret-generic-credential apps/pwa/test/require-auth-next.test.mjs:35
HIGH secret-generic-credential apps/pwa/test/sessions-output-seq.test.mjs:30
HIGH secret-generic-credential apps/pwa/test/sessions-paste.test.mjs:24
HIGH secret-generic-credential apps/pwa/test/sessions-stream-replay.test.mjs:34
HIGH secret-generic-credential apps/pwa/test/sessions.test.mjs:24
HIGH secret-generic-credential apps/pwa/test/signature.test.mjs:6
HIGH secret-generic-credential test/auth.test.mjs:13
HIGH secret-generic-credential test/auth.test.mjs:148
HIGH secret-generic-credential test/console-cookie-malformed.test.mjs:15
HIGH secret-generic-credential test/console.test.mjs:12
HIGH secret-generic-credential test/mirror.test.mjs:37
HIGH secret-generic-credential test/mirror.test.mjs:77

…and 43 more. Full results in the Security tab.

Snippets are redacted; ThreatCrush never prints matched credential material.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant